using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;

namespace XnaDevRu.BulletX
{
	public abstract class DiscreteCollisionDetectorInterface
	{
		public abstract class Result
		{
			public abstract void SetShapeIdentifiers(int partIdA, int indexA, int partIdB, int indexB);
			public abstract void AddContactPoint(Vector3 normalOnBInWorld, Vector3 pointInWorld, float depth);
		}

		public class ClosestPointInput
		{
			private float _maximumDistanceSquared;
			private Matrix _transformA, _transformB;

			#region Properties
			public Matrix TransformB
			{
				get { return _transformB; }
				set { _transformB = value; }
			}

			public Matrix TransformA
			{
				get { return _transformA; }
				set { _transformA = value; }
			}

			public float MaximumDistanceSquared
			{
				get { return _maximumDistanceSquared; }
				set { _maximumDistanceSquared = value; }
			}
			#endregion

			public ClosestPointInput()
			{
				_maximumDistanceSquared = 1e30f;
			}
		}

		public abstract void GetClosestPoints(ClosestPointInput input, Result output, IDebugDraw debugDraw);
	}

	public class StorageResult : DiscreteCollisionDetectorInterface.Result
	{
		private Vector3 _closestPointInB;
		private Vector3 _normalOnSurfaceB;
		private float _distance; //negative means penetration !

		#region Properties

		public float Distance
		{
			get { return _distance; }
			set { _distance = value; }
		}
		public Vector3 NormalOnSurfaceB
		{
			get { return _normalOnSurfaceB; }
			set { _normalOnSurfaceB = value; }
		}
		public Vector3 ClosestPointInB
		{
			get { return _closestPointInB; }
			set { _closestPointInB = value; }
		}

		#endregion

		public StorageResult()
		{
			_distance = 1e30f;
		}

		public override void AddContactPoint(Vector3 normalOnBInWorld, Vector3 pointInWorld, float depth)
		{
			if (depth < _distance)
			{
				_normalOnSurfaceB = normalOnBInWorld;
				_closestPointInB = pointInWorld;
				_distance = depth;
			}
		}

		public override void SetShapeIdentifiers(int partId0, int index0, int partId1, int index1)
		{
			throw new Exception("The method or operation is not implemented.");
		}
	}
}
